//
// Created by Administrator on 2021/11/3.
//

#ifndef MRENDER_VECTOR2_H
#define MRENDER_VECTOR2_H

#include <cmath>
#include "Angle.h"
#include "../core/String.h"
#include "../core/MAssert.h"

class Vector2 {
public:
    float x, y;
public:
    Vector2();
    ~Vector2();
    Vector2(float v[2]);
    Vector2(float nx, float ny);
    //复制
    Vector2(const Vector2 &v);

    static Vector2 zero();
    static Vector2 identity();

    //重写操作符
    Vector2 &operator= (const Vector2 &v);
    bool operator== (const Vector2 &v) const;
    bool operator!= (const Vector2 &v) const;
    Vector2 operator+ (const Vector2 &v) const;
    Vector2 operator- (const Vector2 &v) const;
    Vector2 operator* (float a) const;
    Vector2 operator/ (float a) const;

    float operator* (const Vector2 &v) const;

    float length();
    void normalize();

    String toString();

    /**
     * 向量相减
     */
    static Vector2 subtractVectors(const Vector2& v1, const Vector2& v2);

    /**
     * 计算两个向量的夹角
     * @param v1 向量1
     * @param v2 向量2
     * @return 角度
     */
    static float angle(Vector2 v1, Vector2 v2, AngleType angleType);

    /**
     * 标量左乘
     * @param f 标量
     * @param v2 向量
     * @return 结果
     */
    static Vector2 multiply(float f, Vector2 v2);

    /**
     * 点乘
     * @param v1 向量1
     * @param v2 向量2
     * @return 点乘结果
     */
    static float multiply(Vector2 v1, Vector2 v2);


    /**
     * 两点间距离
     * @param v1 向量1
     * @param v2 向量2
     * @return 距离
     */
    static float distance(Vector2 v1, Vector2 v2);
};


#endif //MRENDER_VECTOR2_H
